﻿//**************************************包含Ajax调用的相关代码***************************

var MyRemoteCall = {
    execServerFunction: function (sFunName, sAssemblyName, bAsync, aParameters, sDataType, oCallBackFunction, aCallBackFunctionParameters) {
        /// <summary>执行服务器dll的静态方法</summary>
        /// <param name="sFunName" type="String">服务器的方法名（完整的方法名，必须带上命名空间）</param>
        /// <param name="sAssemblyName" type="String">方法所在的程序集的名称</param>
        /// <param name="bAsync" type="Boolean">true:异步；false：同步</param>
        /// <param name="aParameters" type="Array">传入到服务器端的参数数组</param>
        /// <param name="sDataType" type="String">从服务器端返回来的数据类型；text:纯文本，默认直接以纯文本返回（注意，如果服务器端的方法生成的是纯文本才适用此类型）；json;xml</param>
        /// <param name="oCallBackFunction" type="Function">回调的js方法</param>
        /// <param name="aCallBackFunctionParameters" type="Array">传递给回调方法的参数（注意；方法的第一个参数永远是调用服务器返回的参数，即使服务器调用的方法没有返回值）</param>
        var sUrl = MyWebsite.getServerAddr() + "Common/Agents/ExecServerFunction.ashx";
        var sPostToServer = this.formatExecServerFuncParams(sFunName, sAssemblyName, aParameters, sDataType);
        return MyAjax.post(sUrl, sPostToServer, bAsync, oCallBackFunction, aCallBackFunctionParameters);
    },
    execServerFunctionSync: function (sFunName, sAssemblyName, aParameters, sDataType) {
        /// <summary>执行服务器dll的静态方法（同步）</summary>
        /// <param name="sFunName" type="String">服务器的方法名（完整的方法名，必须带上命名空间）</param>
        /// <param name="sAssemblyName" type="String">方法所在的程序集的名称</param>
        /// <param name="aParameters" type="Array">传入到服务器端的参数数组</param>
        /// <param name="sDataType" type="String">从服务器端返回来的数据类型；text:纯文本，默认直接以纯文本返回（注意，如果服务器端的方法生成的是纯文本才适用此类型）；json;xml</param>
        return this.execServerFunction(sFunName, sAssemblyName, false, aParameters, sDataType);
    },
    execBLLFunctionSync: function (sFunName, aParameters, sNamespace, sDataType) {
        /// <summary>执行服务器Websites.BLL的方法（同步）</summary>
        /// <param name="sFunName" type="String">服务器的方法名（完整的方法名，必须带上命名空间）</param>
        /// <param name="aParameters" type="Array">传入到服务器端的参数数组</param>
        /// <param name="sNamespace" type="String">方法的命名空间，默认值为：DreamCube.Websites.BLL(区分大小写的）</param>
        /// <param name="sDataType" type="String">从服务器端返回来的数据类型；text:纯文本，默认直接以纯文本返回（注意，如果服务器端的方法生成的是纯文本才适用此类型）；json;xml</param>
        if (!sNamespace) sNamespace = "DreamCube.Websites.BLL";
        return this.execServerFunctionSync(sNamespace + "." + sFunName, sNamespace, aParameters, sDataType);
    },
    execServerFunctionAsync: function (sFunName, sAssemblyName, aCallFunctionParameters, sDataType, oCallBackFunction, aCallBackFunctionParameters) {
        /// <summary>执行服务器dll的静态方法（异步）</summary>
        /// <param name="sFunName" type="String">服务器的方法名（完整的方法名，必须带上命名空间）</param>
        /// <param name="sAssemblyName" type="String">方法所在的程序集的名称</param>
        /// <param name="aCallFunctionParameters" type="Array">传入到服务器端的参数数组</param>
        /// <param name="sDataType" type="String">从服务器端返回来的数据类型；text:纯文本，默认直接以纯文本返回（注意，如果服务器端的方法生成的是纯文本才适用此类型）；json;xml</param>
        /// <param name="oCallBackFunction" type="Function">回调的js方法</param>
        /// <param name="aCallBackFunctionParameters" type="Array">传递给回调方法的参数（注意；方法的第一个参数永远是调用服务器返回的参数，即使服务器调用的方法没有返回值）</param>
        return this.execServerFunction(sFunName, sAssemblyName, true, aCallFunctionParameters, sDataType, oCallBackFunction, aCallBackFunctionParameters);
    },
    execBLLFunctionAsync: function (sFunName, sNamespace, aCallFunctionParameters, sDataType, oCallBackFunction, aCallBackFunctionParameters) {
        /// <summary>执行服务器Websites.BLL的方法（异步）</summary>
        /// <param name="sFunName" type="String">服务器的方法名（完整的方法名，必须带上命名空间）</param>
        /// <param name="sNamespace" type="String">方法的命名空间，可以不传。默认值为：DreamCube.Websites.BLL</param>
        /// <param name="aCallFunctionParameters" type="Array">传入到服务器端的参数数组</param>
        /// <param name="sDataType" type="String">从服务器端返回来的数据类型；text:纯文本，默认直接以纯文本返回（注意，如果服务器端的方法生成的是纯文本才适用此类型）；json;xml</param>
        /// <param name="oCallBackFunction" type="Function">回调的js方法</param>
        /// <param name="aCallBackFunctionParameters" type="Array">传递给回调方法的参数（注意；方法的第一个参数永远是调用服务器返回的参数，即使服务器调用的方法没有返回值）</param>
        if (!sNamespace) sNamespace = "DreamCube.Websites.BLL";
        return this.execServerFunctionAsync(sNamespace + "." + sFunName, sNamespace, aCallFunctionParameters, sDataType, oCallBackFunction, aCallBackFunctionParameters);
    },
    postSync: function (sPageUrl, sPostData) {
        /// <summary>Post数据到指定的服务器页面（同步）</summary>
        /// <param name="sPageUrl" type="String">post的目标页面Url</param>
        /// <param name="sPostData" type="String">Post到页面的数据</param>
        return MyAjax.post(sPageUrl, sPostData, false);
    },
    postAsync: function (sPageUrl, sPostData, oCallBackFunction, aCallBackFunctionParameters) {
        /// <summary>Post数据到指定的服务器页面（异步）</summary>
        /// <param name="sPageUrl" type="String">post的目标页面Url</param>
        /// <param name="sPostData" type="String">Post到页面的数据</param>
        /// <param name="oCallBackFunction" type="Function">回调的js方法</param>
        /// <param name="aCallBackFunctionParameters" type="Array">传递给回调方法的参数（注意；方法的第一个参数永远是调用服务器返回的参数，即使服务器调用的方法没有返回值）</param>
        MyAjax.post(sPageUrl, sPostData, true, oCallBackFunction, aCallBackFunctionParameters);
    },
    formatExecServerFuncParams: function (sFunName, sAssemblyName, aParameters, sDataType) {
        /// <summary>（私有方法）对ExecServerFunction方法的参数进行格式化，把输入参数格式化为xml格式</summary>
        /// <param name="sFunName" type="String">需要调用的服务器端的静态方法名</param>
        /// <param name="sAssemblyName" type="String">方法所在的程序集名</param>
        /// <param name="aParameters" type="Array">传递给服务器方法的参数数组</param>
        /// <param name="sDataType" type="String">从服务器端返回来的数据类型；text:纯文本，默认直接以纯文本返回（注意，如果服务器端的方法生成的是纯文本才适用此类型）；json;xml</param>
        var sParamTemplates = "<Exec><FunName>{0}</FunName><AssemblyName>{1}</AssemblyName><Parameters>{2}</Parameters><DataType>{3}</DataType></Exec>";
        var sParamTemplate = "<Parameter><Value>{0}</Value></Parameter>";
        var sParams = "";
        if (aParameters != null && aParameters.length > 0) {
            for (var i = 0; i < aParameters.length; i++) {
                var sTempParamString;
                if (aParameters[i] != null) sTempParamString = aParameters[i].toString().xmlEncode();
                else sTempParamString = "";
                sParams += sParamTemplate.toString().format(sTempParamString);
            }
        }
        sDataType = sDataType ? sDataType : "text"; //默认返回的文本
        return sParamTemplates.format(sFunName, sAssemblyName, sParams, sDataType);
    }
};
